SHMGET(2) | 리눅스 프로그래머 메뉴얼 | SHMGET(2) |
이름¶
shmget - 공유 메모리 세그먼트를 할당한다.
사용법¶
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, int size, int shmflg);
설명¶
shmget() 는 key 인자값과 관련된 공유 메모리 세그먼트 식별자를 반환한다. 만일, key 가 IPC_PRIVATE 값을 가지고 있거나 또는 key 가 IPC_PRIVATE 가 아니고, key 와 연계되어 있는 공유메모리 세그먼트가 없다면 PAGE_SIZE 의 배수만큼의 size 를 가지고 있는 새로운 공유 메모리 세그먼트가 만들어진다. IPC_CREAT 는 shmflg 에 명시되어 있다. (즉, shmflg&IPC_CREAT 는 0이 아니다.)
shmflg 의 구성은 다음과 같다:
- IPC_CREAT
- 새로운 세그먼트를 만든다. 만일 이 플래그가 사용되지 않는다면, shmget() 는 key와 관련된 세그먼트를 찾을 것이며, 사용자가 그 세그먼트와 관련된 shmid 를 받을 허가권이 있는지 알기 위해서 검사한다. 그리고 세그먼트가 파괴되었다는 표시를 하지 않도록 보장한다.
- IPC_EXCL
- 세그먼트가 존재할경우 실패를 보장하기 위해 IPC_CREAT와 함께 사용된다.
- mode_flags (lowest 9 bits)
- 소유자, 그룹, 그 외들을 보장하기 위해 허가권을 지정한다. 현재, 실행 허가권은 시스템에 의해 사용되지 않는다.
새로운 세그먼트가 생성된다면, shmflg 의 접근 허가권은 세그먼트에 정의되어 있는 shmid_ds 의 shm_perm 멤버로 복사된다. shmid_ds 구조체:
struct shmid_ds { struct ipc_perm shm_perm; /* 퍼미션 */ int shm_segsz; /* 세그먼트의 크기(bytes) */ time_t shm_atime; /* 마지막 접근 시간 */ time_t shm_dtime; /* 마지막 제거 시간 */ time_t shm_ctime; /* 마지막 변경 시간 */ unsigned short shm_cpid; /* 생성자의 pid */ unsigned short shm_lpid; /* 마지막으로 작동한 프로세스 pid */ short shm_nattch; /* 현재 접근한 프로세스의 수 */ };
struct ipc_perm {
key_t key;
ushort uid; /* 소유자의 euid 와 egid */
ushort gid;
ushort cuid; /* 생성자의 euid 와 egid */
ushort cgid;
ushort mode; /* shmflg의 하위 9비트 */
ushort seq; /* 연속 수(sequence number) */ };
게다가, 생성되는 동안 시스템 콜은 시스템 공유 메모리 세그먼트 데이터 구조 shmid_ds 를 다음과 같이 초기화한다.
- shm_perm.cuid 와 shm_perm.uid 는 호출 프로세스의 유효 user-ID로 설정된다.
- shm_perm.cgid 와 shm_perm.gid 는 호출 프로세스의 유효 group-ID로 설정된다.
- shm_perm.mode 의 하위 9비트들은 shmflg 의 하위 9비트들로 설정된다.
- shm_segsz 는 size 값으로 설정된다.
- shm_lpid, shm_nattch, shm_atime 그리고 shm_dtime 는 0 으로 설정된다.
- shm_ctime 는 현재 시간으로 설정된다.
만일 공유 메모리 세그먼트가 이미 존재한다면, 접근 허가권이 조사되며, 파괴도도록 표시되어 있는지 알아보기 위해 검사한다.
SYSTEM CALLS¶
반환값¶
성공시 유효한 세그먼트 식별자 shmid 가 반환되며, 에러시 -1이 반환된다.
에러¶
실패시, errno 는 다음중 하나로 설정된다:
- EINVAL
- 만일 SHMMIN > size, 또는 size > SHMMAX, 또는 size이 세그먼트의 크기보다 크다면 이 에러가 반환된다.
- EEXIST
- IPC_CREAT | IPC_EXCL 이 지정되어 있고, 세그먼트가 존재하면 이 에러가 반환된다.
- EIDRM
- 세그먼트가 파괴나 제거되도록 표시되어 있다면 이 에러가 반환된다.
- ENOSPC
- 가능한 모든 공유 메모리 id (SHMMNI) 를 가졌거나 요청된 size 의 세그먼트 할당이 시스템 전체 공유 메모리 제한값 (SHMALL) 을 초과할경우 반환된다.
- ENOENT
- 주어진 key에 해당하는 세그먼트가 존재하지 않고, IPC_CREAT 가 지정되지 않았다면 반환된다.
- EACCES
- 사용자가 공유 메모리 세그먼트에 대한 접근 허가권이 없을때 반환된다.
- ENOMEM
- 세그먼트를 위해 할당할 메모리가 없을때 반환된다.
주의¶
IPC_PRIVATE 는 플레그 필드가 아니라 key_t 타입이다. 이 특별한 값이 key 에 사용된다면, 시스템 콜은 shmflg 의 하위 9비트들외 모든것을 무시한다. 그리고 새 공유 메모리 세그먼트를 생성(성공시)한다.
다음은 shmget 시스템 콜에 영향을 주는 공유 메모리 세그먼트 자원들의 제한값들이다:
- SHMALL
- 시스템 전체의 공유 메모리 세그먼트 최대 값: 정책 의존적이다.
- SHMMAX
- 공유 메모리 세그먼트의 최대 크기(바이트수): 수행 의존적이다.(현재 4M)
- SHMMIN
- 공유 메모리 세그먼트의 최소 크기(바이트수): 수행 의존적이다.( PAGE_SIZE 가 유효한 최소 크기이지만, 현재는 1byte이다.)
- SHMMNI
- 시스템 전체의 공유 메모리 세그먼트 최대 수: 수행 의존적이다(현재 4096)
수행시 프로세스당 공유 메모리 세그먼트의 특별한 제한은 없다. (SHMSEG)
버그¶
IPC_PRIVATE 를 사용하면 할당된 공유 메모리 세그먼트를 접근하는 다른 프로세스들을 저지하지 않는다.
파일들 때문에, 프로세스를 위해 공유 메모리 세그먼트에 대한 배타적 접근을 보장하기 위한 방법이 현재는 없다. shmflg 비트에 IPC_CREAT 와 IPC_EXCL 의 지정만이 새 공유 메모리 세그먼트 생성을 보장(성공시)한다. 이것은 세그먼트에 대한 배타적 접근을 나타내는 것은 아니다.
호환¶
SVr4, SVID. SVr4 문서는 EEXIST 에러 조건을 추가적으로 기술했다. SVr4 와 SVID 문서들은 EIDRM 조건을 기술하지 않았다.
관련 항목¶
번역¶
정강훈 <skyeyes@soback.kornet.net>
2000년 5월 16일
한글 Manpage 프로젝트
(http://man.kldp.org) 2005년 2월 13일
November 28, 1993 | Linux 0.99.11 |